﻿using System;
using System.Data;
using System.Windows.Forms;
using Infragistics.Win;
using Infragistics.Win.UltraWinGrid;
using Litografia.BusinessComponents;
using Litografia.BusinessEntities;
using Nortec.Security;
using BeforeExitEditModeEventArgs=Infragistics.Win.UltraWinGrid.BeforeExitEditModeEventArgs;
using ColumnStyle=Infragistics.Win.UltraWinGrid.ColumnStyle;
using System.Collections.Generic;

namespace Litografia.UI.Procesos
{
    public partial class RequisicionForm : BaseForm
    {
        #region Constructors

        public RequisicionForm()
        {
            InitializeComponent();
            toolStrip.ItemClicked += ToolStrip_ItemClicked;
        }

        #endregion

        #region Declarations
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
        private bool dommy;
        private BEOT registro = new BEOT();
        private BERequisicion requisicion = new BERequisicion();
        private bool loadingOT;
        private readonly IEnumerable<BEEntity> estadosList = BCOT.GetEstados();
        #endregion

        #region Properties
        public BEOT.OrdenTrabajoRow OrdenTrabajo
        {
            get
            {
                return registro.OrdenTrabajo[0];
            }
        }
        public BERequisicion.RequisicionRow Requisicion
        {
            get
            {
                return requisicion.Requisicion[0];
            }
        }
        private bool OrderLoaded
        {
            get
            {
                return (registro.OrdenTrabajo.Count > 0);
            }
        }
        #endregion

        #region Event Handlers

        private void RequisicionForm_Load(object sender, EventArgs e)
        {
            ConfigureToolBar(toolStrip, ToolBarButtons.New | ToolBarButtons.Approve | ToolBarButtons.Close);
           
            BindOperariosDropDown();
            
            ConfigureGrid(articulosGrid);
            
            ClearControls();
        }

        private void ToolStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            switch ((ToolBarButtons)e.ClickedItem.Tag)
            {
                case ToolBarButtons.New:
                    ClearControls();
                    break;
                case ToolBarButtons.Approve:
                    Save();
                    break;
                case ToolBarButtons.Close:
                    Close();
                    break;
            }
        }

        private void OrdenTrabajoTextBox_Validated(object sender, EventArgs e)
        {
            if (!loadingOT)
                GetRegistroOT();
        }

        private void OrdenTrabajoTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.Enter)
                GetRegistroOT();
        }
        
        private void Grid_InitializeLayout(object sender, InitializeLayoutEventArgs e)
        {
         /*   e.Layout.Bands[0].Columns[requisicion.RequisicionDetalle.IdColumn.ColumnName].Hidden = true;
            e.Layout.Bands[0].Columns[requisicion.RequisicionDetalle.RequisicionIdColumn.ColumnName].Hidden = true;
            e.Layout.Bands[0].Columns[requisicion.RequisicionDetalle.ArticuloIdColumn.ColumnName].Hidden = true;

            e.Layout.Bands[0].Columns[requisicion.RequisicionDetalle.ArticuloNombreColumn.ColumnName].Width = 300;

            e.Layout.Override.HeaderClickAction = HeaderClickAction.Select;
            e.Layout.Override.SelectTypeCol = SelectType.None;

            articulosGrid.DisplayLayout.Override.AllowDelete = DefaultableBoolean.False;
            articulosGrid.DisplayLayout.Override.AllowAddNew =  AllowAddNew.No;

            articulosGrid.DisplayLayout.Bands[0].Columns[requisicion.RequisicionDetalle.ArticuloNombreColumn.ColumnName].CellActivation = Activation.NoEdit;
            articulosGrid.DisplayLayout.Bands[0].Columns[requisicion.RequisicionDetalle.CotizadoColumn.ColumnName].CellActivation = Activation.NoEdit;
            articulosGrid.DisplayLayout.Bands[0].Columns[requisicion.RequisicionDetalle.RetiradoColumn.ColumnName].CellActivation = Activation.NoEdit;
            articulosGrid.DisplayLayout.Bands[0].Columns[requisicion.RequisicionDetalle.SaldoColumn.ColumnName].CellActivation = Activation.NoEdit;
            articulosGrid.DisplayLayout.Bands[0].Columns[requisicion.RequisicionDetalle.RetirarColumn.ColumnName].CellActivation = Activation.AllowEdit;
            
            e.Layout.AutoFitStyle = AutoFitStyle.ResizeAllColumns;*/
        }

        private void Grid_BeforeExitEditMode(object sender, BeforeExitEditModeEventArgs e)
        {
            UltraGridCell cell = null;
            Type cellType = null;
            
            if (articulosGrid.ActiveCell != null)
            {
                cell = articulosGrid.ActiveCell;
                cellType = requisicion.RequisicionDetalle.Columns[cell.Column.Index].DataType;
            }

            if (cell != null)
            {
                switch (cellType.ToString())
                {
                    case "System.Decimal":
                        decimal dummy;
                        if (!string.IsNullOrEmpty(cell.Text) && 
                            (!decimal.TryParse(cell.Text, out dummy) || dummy <= 0 ))
                        {
                            ShowError("El valor ingresado en el campo \"" + cell.Column.Header.Caption + "\" no es válido");
                            e.Cancel = true;
                        }
                        break;
                }
            }
        }

        private void Grid_BeforeRowUpdate(object sender, CancelableRowEventArgs e)
        {
            
        }

        private void Grid_Leave(object sender, EventArgs e)
        {
            if (articulosGrid.ActiveRow != null)
            {
                articulosGrid.PerformAction(UltraGridAction.ExitEditMode, true, true);
                Grid_BeforeRowUpdate(articulosGrid, new CancelableRowEventArgs(articulosGrid.ActiveRow));
            }
        }

        #endregion

        #region Methods: Non-Public

        private void GetRegistroOT()
        {
            loadingOT = true;
            if (!String.IsNullOrEmpty(ordenTrabajoTextBox.Text))
            {
                BCOT.GetOTCotizacion(ordenTrabajoTextBox.Text, registro);

                if (OrderLoaded)
                {
                    if (IsOrderTerminated())
                    {
                        ShowError("La OT especificada se encuentra anulada o finalizada por lo que no es posible realizar guias de requisición para la misma");
                        ClearControls();
                    }
                    else if (IsOrderInProcess())
                    {
                        UnPackOrdenTrabajo();
                        EnableDisableControls();
                    }
                    else
                    {
                        ShowError("La OT especificada aún no se encuentra en proceso por lo que no es posible realizar guias de requisición para la misma");
                        ClearControls();
                    }
                }
                else
                {
                    ShowError("La OT especificada no pudo ser encontrada. Favor revise el número de OT e intente de nuevo.");
                    ClearControls();
                }
            }
            loadingOT = false;

        }

        private void UnPackOrdenTrabajo()
        {

            if (!OrdenTrabajo.IsClienteIdNull())
                clienteLabel.Text = OrdenTrabajo.ClienteId + " - " + OrdenTrabajo.ClienteNombre;

            if (!OrdenTrabajo.IsProductoIdNull())
                productoLabel.Text = OrdenTrabajo.ProductoId + " - " + OrdenTrabajo.ProductoNombre;

            if (!OrdenTrabajo.IsVendedorIdNull())
                vendedorLabel.Text = OrdenTrabajo.VendedorId.ToString() + " - " + OrdenTrabajo.VendedorNombre;

            //articulosGrid.DataSource = registro.OTMaterialCotizado;
        }

        private bool IsOrderTerminated()
        {
            string estado = GetEstadoNombre(estadosList, OrdenTrabajo.EstadoId.ToString());

            return (estado.ToLower().Equals("cerrada") || estado.ToLower().Equals("anulada"));
        }
        private bool IsOrderInProcess()
        {
            string estado = GetEstadoNombre(estadosList, OrdenTrabajo.EstadoId.ToString());

            return estado.ToLower().Equals("en proceso");
        }
        private void Save()
        {
            //To be implemented
            dommy = true;
        }

        private void ClearControls()
        {
            articulosGrid.DataSource = new BERequisicion.RequisicionDetalleDataTable();

            registro = new BEOT();
            requisicion = new BERequisicion();

            clienteLabel.Text = "";
            productoLabel.Text = "";
            vendedorLabel.Text = "";
            operarioComboBox.SelectedIndex = -1;

            ClearControls(Controls);
            ClearErrors();
            EnableDisableControls();
            
            ordenTrabajoTextBox.Focus();
            loadingOT = false;
        }
        
        private void EnableDisableControls()
        {
            ordenTrabajoTextBox.Enabled = !OrderLoaded;
            operarioComboBox.Enabled = OrderLoaded;
            
            ToggleButton(toolStrip, ToolBarButtons.New, OrderLoaded);
            ToggleButton(toolStrip, ToolBarButtons.Approve, OrderLoaded);
        }
        
        private void BindOperariosDropDown()
        {
            var operarios = BCOperario.Get(NortecMembership.CompanyId);
            operarioComboBox.DisplayMember = "Nombre";
            operarioComboBox.ValueMember = "Id";
            operarioComboBox.DataSource = operarios;
            operarioComboBox.SelectedIndex = -1;
        }

        private void ConfigureGrid(UltraGrid grid)
        {
            grid.InitializeLayout += Grid_InitializeLayout;
            grid.BeforeExitEditMode += Grid_BeforeExitEditMode;
            grid.BeforeRowUpdate += Grid_BeforeRowUpdate;
            grid.Leave += Grid_Leave;
        }

        private void ClearErrors()
        {
            //To be implemented
            dommy = true;
        }

        #endregion
    }
}
